package cn.tedu.serial;

import org.apache.avro.Schema;
import org.apache.avro.file.DataFileReader;
import org.apache.avro.file.DataFileWriter;
import org.apache.avro.io.DatumReader;
import org.apache.avro.io.DatumWriter;
import org.apache.avro.io.Encoder;
import org.apache.avro.specific.SpecificDatumReader;
import org.apache.avro.specific.SpecificDatumWriter;
import org.junit.Test;

import java.io.File;
import java.io.IOException;

public class SerialDemo {
    private String targetTextFilePath = "C:\\tedu\\user.txt";

    /**
     * 创建对象
     */
    @Test
    public void createObject() {
        // 方式1: 先创建后赋值
        User u1 = new User();
        u1.setUsername("Alex");
        u1.setAge(18);
        u1.setGender("male");
        u1.setHeight(185.0);
        u1.setWeight(65.8);
        System.out.println(u1);

        // 方式2: 在创建的时候赋值
        User u2 = new User("Lucy", 22, "female", 168.2, 49.8);
        System.out.println(u2);

        // 方式3: 建造者模式
        // 创建一个和u2相同属性但是名字不一样的对象
        User u3 = User.newBuilder(u2).setUsername("Lily").build();
        System.out.println(u3);
    }

    /**
     * 序列化
     */
    @Test
    public void serial() throws IOException {
        // 创建对象
        User u1 = new User("Amy", 15, "female", 153.8, 45.5);
        User u2 = new User("Jack", 17, "male", 183.8, 64.5);
        User u3 = new User("Helen", 18, "female", 168.8, 55.5);

        // 创建序列化流
        DatumWriter<User> datumWriter = new SpecificDatumWriter<User>(User.class);
        // 将序列化之后的数据写到文件中，需要创建一个文件流
        DataFileWriter<User> dataFileWriter = new DataFileWriter<User>(datumWriter);
        // 指定文件 --- 第一个参数表示按照avsc的格式对数据整理, 下面三行代码作用一致, 表示了DataFileWriter.create()的第一个参数的不同填写方法
        dataFileWriter.create(User.SCHEMA$, new File(targetTextFilePath));
        // dataFileWriter.create(User.getClassSchema(), new File("C:\\tedu\\user.txt"));
        // dataFileWriter.create(u1.getSchema(), new File("C:\\tedu\\user.txt"));
        // 序列化对象
        dataFileWriter.append(u1);
        dataFileWriter.append(u2);
        dataFileWriter.append(u3);
        // 关流
        dataFileWriter.close();
    }

    /**
     * 反序列化
     */
    @Test
    public void deSerial() throws IOException {
        // 创建反序列化流
        DatumReader<User> datumReader = new SpecificDatumReader<>(User.class);
        // 创建文件流读取数据
        DataFileReader<User> dataFileReader = new DataFileReader<User>(new File(targetTextFilePath), datumReader);
        // 读取对象, DataFileReader将读取过程封装成了迭代器来使用
        while (dataFileReader.hasNext()) {
            User user = dataFileReader.next();
            System.out.println(user);
        }
        // 关流
        dataFileReader.close();
    }
}
